package com.fitness.util;

import java.io.FileOutputStream;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

public class BasicsUtil {
	private static double EARTH_RADIUS = 6378.137;// 单位千米
	
	 public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

	/**
	 * md5加密
	 * @param str
	 * @return
	 */
	public final static String getMD5(String pwd) {  
        //用于加密的字符  
        char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',  
                'A', 'B', 'C', 'D', 'E', 'F' };  
        try {  
            //使用平台的默认字符集将此 String 编码为 byte序列，并将结果存储到一个新的 byte数组中  
            byte[] btInput = pwd.getBytes();  
               
            //信息摘要是安全的单向哈希函数，它接收任意大小的数据，并输出固定长度的哈希值。  
            MessageDigest mdInst = MessageDigest.getInstance("MD5");  
               
            //MessageDigest对象通过使用 update方法处理数据， 使用指定的byte数组更新摘要  
            mdInst.update(btInput);  
               
            // 摘要更新之后，通过调用digest（）执行哈希计算，获得密文  
            byte[] md = mdInst.digest();  
               
            // 把密文转换成十六进制的字符串形式  
            int j = md.length;  
            char str[] = new char[j * 2];  
            int k = 0;  
            for (int i = 0; i < j; i++) {   //  i = 0  
                byte byte0 = md[i];  //95  
                str[k++] = md5String[byte0 >>> 4 & 0xf];    //    5   
                str[k++] = md5String[byte0 & 0xf];   //   F  
            }  
               
            //返回经过加密后的字符串  
            return new String(str);  
               
        } catch (Exception e) {  
            return null;  
        }  
    }  
	
	/**
	 * 自动补4个o
	 * @param i
	 * @return
	 */
	public static String projectNumberUtil(String i) {
		Integer valueOf = Integer.valueOf(i);
		String format = String.format("%04d", valueOf+1);
		return  format;
	}
	
	/**
	 * 自动补2个o
	 * @param i
	 * @return
	 */
	public static String stringFormatUtil(Integer i) {
		String format = String.format("%02d", i);
		return  format;
	}
	
	/**
	 * 角度弧度计算公式 rad:(). <br/>
	 * 
	 * 360度=2π π=Math.PI
	 * 
	 * x度 = x*π/360 弧度
	 * 
	 * @author chiwei
	 * @param d
	 * @return
	 * @since JDK 1.6
	 */
	private static double getRadian(double degree) {
		return degree * Math.PI / 180.0;
	}
	/**
	 * 依据经纬度计算两点之间的距离 GetDistance:(). <br/>
	 * 
	 * 
	 * @author chiwei
	 * @param lat1
	 *            1点的纬度
	 * @param lng1
	 *            1点的经度
	 * @param lat2
	 *            2点的纬度
	 * @param lng2
	 *            2点的经度
	 * @return 距离 单位 米
	 */
	public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
		double radLat1 = getRadian(lat1);
		double radLat2 = getRadian(lat2);
		double a = radLat1 - radLat2;// 两点纬度差
		double b = getRadian(lng1) - getRadian(lng2);// 两点的经度差
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1)
				* Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		return s * 1000;
	}
	
	/**
	 * string经纬度的加减小于100m
	 */
	public static boolean distance100M(String latitude1,String longitude1,String latitude2,String longitude2) {
		//系统规定的纬度
		double lat1 = Double.parseDouble(latitude1);
		//系统规定的经度
		double lng1 = Double.parseDouble(longitude1);
		//页面上传递过来的纬度
		double lat2 = Double.parseDouble(latitude2);
		//页面上传递过来的经度
		double lng2 = Double.parseDouble(longitude2);
		double distance = getDistance(lat1, lng1, lat2, lng2);
		if (distance<100) {
			return true;
		}		
		else {
			return false;
		}
	}
	/**
	 * 生成32位唯一订单号
	 */
	public static String getOrderNumber32() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		String str =  sdf.format(new Date());
		
		StringBuffer sb = new StringBuffer();
		  Random random = new Random();
		  for (int i = 0; i < 18; i++) {
		   sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
		  }
		  return str+sb.toString();
	}
	
	public static void buff2Image(byte[] b,String tagSrc) throws Exception  
     {  
         FileOutputStream fout = new FileOutputStream(tagSrc);  
         //将字节写入文件  
         fout.write(b);  
         fout.close();  
     }  
}
